#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int* getarray()
{
    static int a[3] = {1,2,3};
    return a;
}

typedef struct student
{
    int id;
    char *name;
}Stu;

//初始化
Stu* InitStu(const char * name,int id)
{
    Stu * s = (Stu*)malloc(sizeof(Stu));
    if(s == NULL)
        return NULL;

    s->name = (char *)malloc(strlen(name)+1);
    if(s->name == NULL)
    {
        free(s);
        return NULL;
    }
    strcpy(s->name,name);
    s->id = id;
}

void ClearStu(Stu *s)
{
    free(s->name);
    free(s);
}

int main()
{
    //int *a = getarray();

    //堆上空间申请函数malloc
    // int *a = (int*)malloc(4);
    // if(a == NULL)
    // {
    //     printf("malloc error!\n");
    //     return -1;
    // }
    // *a = 10;
    // printf("%d\n",*a);

    // //释放申请的内存
    // free(a);

    
    
    //申请一维数组
    // int *a = malloc(10* sizeof(int));
    // if(a == NULL)
    // {
    //     printf("malloc error!\n");
    //     return -1; 
    // }
    // for(int i = 0; i < 10 ; i++)
    // {
    //     a[i] = i+1;
    //     printf("%d ",a[i]);
    // }
    // printf("\n");
    // free(a);

    
    
    //申请二维数组
    // int** a = (int **)malloc(2 * sizeof(int*));
    // if(a == NULL)
    // {
    //     printf("malloc error!\n");
    //     return -1;
    // }

    // for(int i = 0; i < 2; i++)
    // {
    //     a[i] = (int*)malloc(3 * sizeof(int));
    //     if(a[i] == NULL)
    //     {
    //         printf("malloc error!\n");
    //         return -1;
    //     }
    // }

    // for(int i = 0; i < 2; i++)
    // {
    //     for(int j = 0; j < 3; j++)
    //     {
    //         a[i][j] = i*3 + (j+1);
    //         printf("%d",a[i][j]);
    //     }
    //     printf("\n");
    // }

    // for(int i = 0; i < 2; i++)
    // {
    //     free(a[i]);
    // }
    // free(a);



    //申请结构体
    // Stu *s = (Stu*)malloc(sizeof(Stu));
    // if(s == NULL)
    // {
    //     printf("malloc error!\n");
    // }

    // s->id = 1;
    // char *name = "zhangsan";
    // s->name = (char*)malloc(strlen(name)+1);
    // strcpy(s->name,name);
    // printf("%d %s\n",s->id,s->name);

    // free(s->name);
    // free(s);

    Stu *s = InitStu("zhangsan",1);
    if(s == NULL)
        return 0;
    printf("%d %s\n",s->id,s->name);

    ClearStu(s);
    //释放以后要置空
    s == NULL;



    //二次释放问题
    int *a = malloc(sizeof(int));
    if(a != NULL)
    {
        free(a);
        a = NULL;
    }
    if(a != NULL)
    {
        free(a);
        a = NULL;
    }
    return 0;
}